/*
	This file is part of AVRCppLib.

    AVRCppLib is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    AVRCppLib is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with AVRCppLib.  If not, see <http://www.gnu.org/licenses/>.

    Copyright (C) Maxime Lemonnier 2007-2011
 */

#include "DictionnaryCallbackServer.h"






DictionnaryCallbackServer * DictionnaryCallbackServer::getInstance()
{
	static DictionnaryCallbackServer * instance;

	if(isNull(instance))
		instance = new DictionnaryCallbackServer;

	return instance;
}

DictionnaryCallbackServer::DictionnaryCallbackServer()
{
	interruptToCallback = new Dictionary<void(*)(), Callback *>(INTERRUPT_VECTOR_COUNT);
}

DictionnaryCallbackServer::~DictionnaryCallbackServer()
{
	// TODO Auto-generated destructor stub
}

void DictionnaryCallbackServer::connect(void(*interrupt)(), Callback * callback)
{
	Callback ** callbackSlot = interruptToCallback->find(interrupt);

	if(isNull(callbackSlot))
		interruptToCallback->insertElement(interrupt, callback);
	else
		*callbackSlot = callback;

}

void DictionnaryCallbackServer::dispatch(void(*interrupt)())
{
	Callback ** callbackSlot = interruptToCallback->find(interrupt);

	if(!isNull(callbackSlot))
	{
		Callback * callback = *callbackSlot;

		if(!isNull(callback))
			callback->callback();
	}

}

void DictionnaryCallbackServer::disconnect(void(*interrupt)())
{
	Callback ** callbackSlot = interruptToCallback->find(interrupt);

	if(!isNull(callbackSlot))
		*callbackSlot = NULL;
}

//void DictionnaryCallbackServer::initialize(void(*interrupt)())
//{
//	interruptToCallback->insertElement(interrupt, NULL);
//
//}
